package JackSu._集合.Collection;

import org.junit.Test;

import java.util.*;
/**
 * 一、集合框架的概述
 *
 * 1.集合、数组都是对多个数据进行存储操作的结构，简称Java容器。
 *  说明：此时的存储，主要指的是内存层面的存储，不涉及到持久化的存储（.txt,.jpg,.avi，数据库中）
 *
 * 2.1 数组在存储多个数据方面的特点：
 *      > 一旦初始化以后，其长度就确定了。
 *      > 数组一旦定义好，其元素的类型也就确定了。我们也就只能操作指定类型的数据了。
 *       比如：String[] arr;int[] arr1;Object[] arr2;
 * 2.2 数组在存储多个数据方面的缺点：
 *      > 一旦初始化以后，其长度就不可修改。
 *      > 数组中提供的方法非常有限，对于添加、删除、插入数据等操作，非常不便，同时效率不高。
 *      > 获取数组中实际元素的个数的需求，数组没有现成的属性或方法可用
 *      > 数组存储数据的特点：有序、可重复。对于无序、不可重复的需求，不能满足。
 *
 * 二、集合框架
 *      |----Collection接口：单列集合，用来存储一个一个的对象
 *          |----List接口：存储有序的、可重复的数据。  -->“动态”数组
 *              |----ArrayList、LinkedList、Vector
 *
 *          |----Set接口：存储无序的、不可重复的数据   -->高中讲的“集合”
 *              |----HashSet、LinkedHashSet、TreeSet
 *
 *      |----Map接口：双列集合，用来存储一对(key - value)一对的数据   -->高中函数：y = f(x)
 *              |----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
 *
 *
 * 三、Collection接口中的方法的使用
 * **/
public class _01Collection中的15个常用方法 {
    @Test
    public void test1() {
        //add
        Collection collection = new ArrayList();
        collection.add("AA");
        collection.add(123);
        collection.add(new Person("JackSu", 18));

        //size()
        System.out.println(collection.size());
        //addAll 将一个集合的元素全部添加到当前集合当中
        Collection collection1 = new ArrayList();
        collection1.add("集合1的字符");
        collection1.addAll(collection);
        System.out.println(collection1);

        //clear 清空当前元素
        collection1.clear();
        System.out.println(collection1);

        //contains方法比较的实质 实际上是调用Object类的equals方法重写的话
        // 则是子类的的equals方法 即属性内容的比较

        System.out.println(collection.contains(new String("AA")));
        //对象的比较是自身重写的equals方法
        System.out.println(collection.contains(new Person("JackSu", 18)));

        //containsAll
        Collection collection2 = Arrays.asList("AA", 123, new Person("JackSu", 18));
        System.out.println(collection.containsAll(collection2));
        //remove 和上面一样比较的是内容
        System.out.println(collection.remove(new Person("JackSu", 18)));
        System.out.println(collection);
        //remove All 同上  差集

    }


    @Test
    public void test2() {
        Collection collection = new ArrayList();
        collection.add(123);
        collection.add(456);
        collection.add(new Person("jack", 16));
        collection.add(false);
        //asList 将数组转化为集合
        Collection collection1 = Arrays.asList(123, 456);

        //交集  可变性
        System.out.println(collection.retainAll(collection1));
        System.out.println(collection);

        //equals 有序无序比较

        //hashCode
        System.out.println(collection.hashCode());

        //toArrays
        Object[] objects = collection.toArray();
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);


        }


    }

    @Test
    public void iterator() {
        //迭代器 iterator 用于遍历集合 可以直接用集合的方式拿到
        Collection collection = new ArrayList();
        collection.add(123);
        collection.add(456);
        collection.add(new Person("jack", 16));
        collection.add(false);
        Iterator iterator = collection.iterator();

        //用循环方式遍历
//        for (int i = 0; i < collection.size(); i++) {
//            System.out.println(iterator.next());
//        }
        //while方式类似jdbc的遍历
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }


    }

    //测试Iterator中的remove()
    //如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法，
    // 再调用remove都会报IllegalStateException。
    @Test
    public void test3(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //删除集合中"Tom"
        Iterator iterator = coll.iterator();
        while (iterator.hasNext()){
//            iterator.remove();
            Object obj = iterator.next();
            if("Tom".equals(obj)){
                iterator.remove();
//                iterator.remove();
            }

        }
        //遍历集合
        iterator = coll.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }


}
